﻿using FreeSql;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using System;
using System.Linq;

public static class FreeSqlExtensionsEFCoreModelBuilderCodeFirstExtensions {

public static void ConfigEntity(this ICodeFirst codeFirst, IModel efmodel) {

	foreach (var type in efmodel.GetEntityTypes()) {

		codeFirst.ConfigEntity(type.ClrType, a => {

			//表名
			var relationalTableName = type.FindAnnotation("Relational:TableName");
			if (relationalTableName != null) {
				a.Name(relationalTableName.Value?.ToString() ?? type.ClrType.Name);
			}

			foreach (var prop in type.GetProperties()) {

				var freeProp = a.Property(prop.Name);

				//列名
				var relationalColumnName = prop.FindAnnotation("Relational:ColumnName");
				if (relationalColumnName != null) {

					freeProp.Name(relationalColumnName.Value?.ToString() ?? prop.Name);
				}

				//主键
				freeProp.IsPrimary(prop.IsPrimaryKey());

				//自增
				freeProp.IsIdentity(
					prop.ValueGenerated == ValueGenerated.Never ||
					prop.ValueGenerated == ValueGenerated.OnAdd ||
					prop.GetAnnotations().Where(z =>
						z.Name == "SqlServer:ValueGenerationStrategy" && z.Value.ToString().Contains("IdentityColumn") //sqlserver 自增
						|| z.Value.ToString().Contains("IdentityColumn") //其他数据库实现未经测试
					).Any()
				);

				//可空
				freeProp.IsNullable(prop.AfterSaveBehavior != PropertySaveBehavior.Throw);

				//类型
				var relationalColumnType = prop.FindAnnotation("Relational:ColumnType");
				if (relationalColumnType != null) {

					var dbType = relationalColumnType.ToString();

					if (!string.IsNullOrEmpty(dbType)) {

						var maxLength = prop.FindAnnotation("MaxLength");
						if (maxLength != null)
							dbType += $"({maxLength})";

						freeProp.DbType(dbType);
					}
				}
			}
		});
	}
}
}